package com.fanghuyun.iswaf.common;
import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class DirMonitor implements Runnable {

    /**
     * 监控的文件路径
     */
    private String dir;

    /**
     * 扫描间隔时间以秒为单位
     */
    private int period;

    /**
     * 原有文件信息
     */
    private Map < String, String > oldDirFileMap;

    /**
     * 初始化相关数据
     */
    public DirMonitor(String dir, int period) {
        this.dir = dir;
        this.period = period;
        this.oldDirFileMap = new HashMap < String, String >();
    }

    /**
     * 线程的执行。对于修改文件的情况，则视为删除与增加两个操作。
     */
    public void run() {
        boolean isError = false;
        File file = new File(dir);
        // 初始化开始监控时的文件路径状态
        totalScan(file, oldDirFileMap);
        // 展示原有路径下的文件信息
        displayNowFile();
        while (!isError) {
            try {
                Thread.sleep(period * 1000);
                // 指定时间间间隔后扫描路径
                Map < String, String > nowDirFileMap = new HashMap < String, String >();
                totalScan(file, nowDirFileMap);
                // 得到删除的文件及文件夹
                getDeletedFile(nowDirFileMap);
                // 得到新增的文件及文件夹
                getAddedFile(nowDirFileMap);
                // 注意：由于涉及到修改，所以一定要先检测删除的文件，然后再检测新增加的文件
            } catch (InterruptedException e) {
                System.out.println("对指定的文件路径进行监控时产生异常，异常信息为：" + e.getMessage());
                isError = true;
            }
        }
    }

	/**
	 * 递归扫描整个路径
	 * @param file  要扫描的路径
	 * @param dirFileMap 存放扫描结果
	 */
	private void totalScan(File file, Map<String, String> dirFileMap) {
		String[] fileList = file.list();
		// 判断是否为空目录
		if (null != fileList) {
			for (int i = 0; i < fileList.length; i++) {
				String pname = file.getAbsolutePath() + "\\" + fileList[i];
				File tempFile = new File(pname);
				if (tempFile.isDirectory()) {
					dirFileMap.put("文件夹：" + pname, tempFile.lastModified() + "");//修改了此处
					totalScan(tempFile, dirFileMap);
				} else {
					// 不相同的文件夹下，存放的文件可能名字相同，但是同一路径下的文件肯定不会相同，
					// 所以采用全路径做为key值
					dirFileMap.put("文件：" + pname, tempFile.lastModified() + "");//修改了此处
				}
			}
		}
	}

	/**
	 * 得到增加的文件及文件夹,并增加到已有的文件信息中
	 */
	private void getAddedFile(Map<String, String> nowDirFileMap) {
		for (Iterator<String> iterator = nowDirFileMap.keySet().iterator(); iterator.hasNext();) {
			String key = iterator.next();
			String oldValue = oldDirFileMap.get(key);
			String newValue = nowDirFileMap.get(key);
			if (null == oldValue) {
				oldDirFileMap.put(key, newValue);
				System.out.println("新增的" + key);
			}
		}
	}

	/**
	 * 得到删除的文件及文件夹,并删除已经不存在的文件信息
	 */
	private void getDeletedFile(Map<String, String> nowDirFileMap) {
		for (Iterator<String> iterator = oldDirFileMap.keySet().iterator(); iterator.hasNext();) {
			String key = iterator.next();
			String oldValue = oldDirFileMap.get(key);
			String newValue = nowDirFileMap.get(key);
			if (null == nowDirFileMap.get(key)) {
				System.out.println("删除的" + key);
				iterator.remove();
				oldDirFileMap.remove(key);
			} else if (!newValue.equals(oldValue)) {//修改了此处
				System.out.println("修改的" + key);
				oldDirFileMap.put(key, newValue);
			}
		}
	}

	/**
	 * 展示原有文件
	 */
	private void displayNowFile() {
		System.out.println(dir + "路径原有文件目录如下：\n");
		Set<String> set = oldDirFileMap.keySet();
		Iterator<String> iterator = set.iterator();
		while (iterator.hasNext()) {
			System.out.println(iterator.next());//此处修改
		}
		System.out.println("========================");
	}

    /**
     * just for test
     * @param args
     */
    public static void main(String[] args) {
        DirMonitor dirMonitor = new DirMonitor("d:/jsp", 2);
        dirMonitor.run();
    }
}